perm filename DCOPY.SAI[11,HE] blob
sn#701171 filedate 1983-03-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "disk image copy program" comment DCOPY.SAI
C00010 ENDMK
C⊗;
BEGIN "disk image copy program" comment DCOPY.SAI;
DEFINE CRLF="('15&'12)",
! = "COMMENT ",
TIL="STEP 1 UNTIL";
REQUIRE "11UTIL.HDR[11,SYS]" SOURCE_FILE;
DEFINE buflen = "'6000";
INTEGER bufadr,cyl,chan,brk,eof,cnt,flg,drv,sum,tmp,i,ck1,op;
SAFE INTEGER ARRAY foo[1:2*buflen];
STRING fname,s;
alinit;
PRINT("10-11 Disk Copy Program",crlf);
PRINT(" (files will be written on logical device U:)",crlf,crlf);
chan ← getchan;
OPEN(chan,"U",'17,17,17,cnt,brk,eof);
! was OPEN(chan,"DSK",'17,17,17,cnt,brk,eof);
WHILE TRUE DO BEGIN "loop"
PRINT("Read from 11 or Write to 11 (R/W): ");
op ← (INCHWL LOR '40)="w";
PRINT("Disk name on 10 (<cr> to exit): ");
fname ← inchwl; IF fname = NULL THEN CALL(0,"EXIT");
PRINT("Drive number on 11: "); drv ← CVD(INCHWL);
POKE('1002,drv); ! Tell 11 which drive to use;
IF op THEN
BEGIN ! Get ready to Write out;
LOOKUP(chan,fname,flg);
IF flg THEN BEGIN PRINT("Can't find file - aborted"&crlf); CONTINUE END;
PRINT("Type Y to confirm the write: "); IF (INCHWL LOR '40)≠"y" THEN CONTINUE;
POKE('1004,2); ! Tell 11 to start writing;
PRINT(crlf&"Starting write of: ",fname,crlf&" cyl: ");
SUM ← 0;
FOR cyl ← 1 TIL 203 DO
BEGIN
ARRYIN(chan,foo[1],buflen); ! Read it from disk;
FOR i ← 1 TIL buflen DO ! Compute the checksum;
Begin
TMP ← SUM + (SUM lsh 1);
SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
End;
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Sleep for 1 tick;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while writing cylinder ",cyl-2,crlf);
CONTINUE "loop";
END;
FOR i ← buflen STEP -1 UNTIL 1 do ! Unpack it;
BEGIN
foo[2*i] ← foo[i] land '777777;
foo[2*i-1] ← foo[i] lsh -18;
END;
POKEARRAY(bufadr,2*buflen,foo,OWPW); ! Write the cylinder out;
POKE('1000,0); ! Tell 11 we're done with buffer;
IF (cyl MOD 20) = 0 THEN PRINT(cyl," ");
END;
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Check 2nd last cyl was ok;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while writing cylinder 202"&crlf);
CONTINUE;
END;
POKE('1000,0); ! Tell 11 we're done with buffer;
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Wait til 11 writes last cyl;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while writing cylinder 203"&crlf);
CONTINUE;
END;
POKE('1000,0); ! Tell 11 we're done with buffer;
CLOSE(chan);
ck1 ← sum;
PRINT(crlf&"Confirming the write" & crlf);
END
ELSE ! Here for read from 11;
BEGIN
ENTER(chan,fname,flg);
POKE('1004,1); ! Tell 11 to start reading;
PRINT(crlf&"Starting read of: ",fname,crlf&" cyl: ");
SUM ← 0;
FOR cyl ← 1 TIL 203 DO
BEGIN
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Sleep for 1 tick;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while reading cylinder ",cyl-1,crlf);
CONTINUE "loop";
END;
PEEKARRAY(bufadr,2*buflen,foo,OWPW); ! Read the cylinder in;
POKE('1000,0); ! Tell 11 we're done with buffer;
FOR i ← 1 TIL buflen do ! Pack it;
foo[i] ← foo[2*i] lor (foo[2*i-1] lsh 18);
ARRYOUT(chan,foo[1],buflen); ! Store it to disk;
FOR i ← 1 TIL buflen DO ! Compute the checksum;
Begin
TMP ← SUM + (SUM lsh 1);
SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
End;
IF (cyl MOD 20) = 0 THEN PRINT(cyl," ");
END;
CLOSE(chan);
ck1 ← sum;
PRINT(crlf&"Confirming the read" & crlf);
END;
POKE('1004,1); ! Tell 11 to start re-reading;
SUM ← 0;
print("Verifying copy...",crlf," cyl: ");
FOR cyl ← 1 TIL 203 DO
BEGIN
WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Sleep for 1 tick;
IF bufadr LAND 1 THEN
BEGIN
PRINT("Disk Error while reading cylinder ",cyl,crlf);
CONTINUE "loop";
END;
PEEKARRAY(bufadr,2*buflen,foo,OWPW); ! Read the cylinder in;
POKE('1000,0); ! Tell 11 we're done with buffer;
FOR i ← 1 TIL buflen do ! Pack it;
foo[i] ← foo[2*i] lor (foo[2*i-1] lsh 18);
FOR i ← 1 TIL buflen DO ! Compute the checksum;
Begin
TMP ← SUM + (SUM lsh 1);
SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
End;
IF (cyl MOD 20) = 0 THEN PRINT(cyl," ");
END;
S ← "";
tmp ← abs(ck1);
While tmp neq 0 Do
Begin
S ← S & ("A" + (tmp mod 26));
tmp ← tmp div 26;
End;
IF ck1 = sum THEN PRINT(crlf & "Checksums match = ",S, " - Copy complete" & crlf)
ELSE
BEGIN
PRINT(crlf & "Checksums don't match - Error" & crlf);
S ← S & " ";
SUM ← abs(SUM);
While SUM neq 0 Do
Begin
S ← S & ("A" + (SUM mod 26));
SUM ← SUM div 26;
End;
PRINT(" The two checksums: ",S,crlf);
END;
END;
END;